/**
 * @param {number} n
 * @return {number}
 */
var totalNQueens = function (n) {
  const isValid = function (row, col, chessBoard, n) {
    // 判断每一列有没有重复的
    for (let i = 0; i < row; i++) {
      if (chessBoard[i][col] === 'Q') {
        return false
      }
    }
    // 判断对角线45°们不能是Q
    for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
      if (chessBoard[i][j] === 'Q') {
        return false
      }
    }
    for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
      if (chessBoard[i][j] === 'Q') {
        return false
      }
    }
    return true
  }

  let result = 0
  const backTracking = function (row, chessBoard) {
    // 传入参数 第几行 棋盘
    if (row === n) {
      // 如果传入的行数等于传入的值n 也就是到达了最底部
      result++ // 将棋盘插入到结果数组中
      return
    }
    for (let col = 0; col < n; col++) {
      // 遍历每一行的每一个元素
      if (isValid(row, col, chessBoard, n)) { // 传入的是当前的行 当前的列 和棋盘元素 和n
        // 如果满足列不相等对角线不相等的条件
        chessBoard[row][col] = 'Q'
        backTracking(row + 1, chessBoard) // 进入下一次递归
        chessBoard[row][col] = '.' // 退出递归进入修改成默认值.
      }
    }
  }

  let chessBoard = new Array(n).fill().map(() => new Array(n).fill('.')) // 生成默认棋盘
  backTracking(0, chessBoard)
  return result
};